package vargapeter.bet.server;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
import java.util.Scanner;

import vargapeter.bet.BookmakerRemote;
import vargapeter.bet.Log;
import vargapeter.bet.SportEventBase;

/**
 * A fogadókat kezelő osztály. Beolvassa fájlból a fogadókat és elindítja őket.
 */
public class SportBetterManager extends Manager {
	private List<SportBetter> betters = new ArrayList<SportBetter>();

	public SportBetterManager(List<Integer> bookmakers) throws IOException {
		super(bookmakers);
		initBetters();

	}

	/**
	 * Fájlból olvassa a fogadókat és eltárolja őket egy listában.
	 * 
	 * @throws IOException
	 */
	private void initBetters() throws IOException {
		Scanner sc = new Scanner(getClass().getResourceAsStream("/sportfogado.txt"));
		sc.useDelimiter("\t");
		while (sc.hasNext()) {
			betters.add(new SportBetter(sc.next(), sc.nextInt()));
		}
	}

	/**
	 * Lekezeli a hozzá tartozó fogadót.
	 */
	private class SportBetterHandler implements Runnable {
		private SportBetter better;

		/* A lehetséges kimenetelek amikre véletlenszerűen fogadunk */
		private String[] outcomes = new String[] { SportEventBase.HOME, SportEventBase.AWAY, SportEventBase.DRAW };

		private Random rnd = new Random();

		public SportBetterHandler(SportBetter better) {
			super();
			this.better = better;
		}

		public void run() {
			try {
				int currentTime = 0;
				while (true) {
					/* 5 másodpercenként megkérdezzük az irodákat, hogy nyertünk-e valamit */
					if (currentTime % 5000 == 0) {
						for (BookmakerRemote bookmaker : bookmakerServers) {
							int sum = bookmaker.isWon(better.getName());
							better.setMoney(better.getMoney() + sum); /* hozzáadjuk a nyereményt a fogadó pénzéhez */
							Log.logForClient(better.getName(), "\t", "Nyert: " + sum);
						}
					}

					/* Véletlenszerű időközönként lekérik az eseményeket az oddsokkal és véletlenszerűen fogadnak rájuk */
					int randomInterval = 2000 + rnd.nextInt(3000); /* 2-5 másodperces időközönként fogadunk */
					if (currentTime % randomInterval == 0) {
						/* minden fogadóirodával felvesszük a kapcsolatot */
						for (BookmakerRemote bookmaker : bookmakerServers) {
							String[] eventNames = bookmaker.sportEvents();
							Log.logForClient(better.getName(), "\t", "Sportesemények: ", Arrays.toString(eventNames));

							/*
							 * minden eseménynek lekérjük az odds-át, de igazából nem teszünk vele semmit mert a fogadási stratégia véletlenszerűen szimulálandó
							 */
							for (int i = 0; i < eventNames.length; i++) {
								int[] odds = bookmaker.odds(eventNames[i]);
								Log.logForClient(better.getName(), "\t", "Oddsok: ", Arrays.toString(odds));
							}

							/* véletlenszerű eseményre, kimenetelre fogadunk a pénzünk 10%-ával */
							String randomBetOutcome = outcomes[rnd.nextInt(outcomes.length)];
							if (eventNames.length > 0 ) /* csak akkor fogadunk ha van esemény */{
								String randomBetEventName = eventNames[rnd.nextInt(eventNames.length)];
								/* csak akkor egyszer fogadunk egy eseményre */
								if (!better.isBettedOn(randomBetEventName)) {
	 								int moneyToBet = Math.round(better.getMoney() / 10);
									bookmaker.bet(better.getName(), randomBetEventName, randomBetOutcome, moneyToBet);
									better.setMoney(better.getMoney() - moneyToBet); /* levonjuk azt az összeget amivel fogadtunk */
									better.addToBettedGames(randomBetEventName);
									Log.logForClient(better.getName(), "\t", "Fogad: ", randomBetEventName, randomBetOutcome, moneyToBet);
								}
							}
						}
					}

					Thread.sleep(1);
					currentTime++;
				}
			} catch (Exception ex) {
				ex.printStackTrace();
			}
		}
	}

	/**
	 * Minden fogadót külön szálon futtat.
	 */
	public void init() {
		for (SportBetter better : betters) {
			new Thread(new SportBetterHandler(better)).start();
		}
	}
}
